package be.vdab.dao;

import java.sql.*;
import java.util.*;

import be.vdab.entities.Voorstelling;

public class VoorstellingDAO {

	private static final String RESERVEER_VOORSTELLING = "select * from voorstellingen where voorstellingsnr =?";
	private static final String VOORSTELLINGEN_PER_GENRE = "Select * from voorstellingen where genrenr = ?";
	private static final String ZOEK_VOORSTELLING = "Select * from voorstellingen where voorstellingsnr = ?";
	private static final String UPDATE_PLAATSEN = "update voorstellingen set VrijePlaatsen = VrijePlaatsen - ? where voorstellingsnr = ?";
	private final DatabaseUtil databaseUtil = new DatabaseUtil();
	//SINGLETON
	private static final VoorstellingDAO instance=new VoorstellingDAO();
	public static VoorstellingDAO getInstance(){
		return instance;
	}
	private VoorstellingDAO(){
		
	}
	//--SINGLETON
	

	public void updateVrijePlaatsen(Long plaatsen, Long nummer){
		Connection connection = null;		
		PreparedStatement statement = null;
		try {			
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(UPDATE_PLAATSEN);
			statement.setLong(1, plaatsen);
			statement.setLong(2, nummer);
			statement.executeUpdate();
		}catch(SQLException ex) {
			throw new DAOException("kan plaatsen niet aanpassen" + ex);
		} finally {
			databaseUtil.close(statement, connection);
		}
	}
	
	public Voorstelling zoekVoorstelling (Long nummer){
		Connection connection = null;
		ResultSet resultSet = null;
		PreparedStatement statement = null;
		try {
			Voorstelling voorstelling = null;
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(ZOEK_VOORSTELLING);
			statement.setLong(1, nummer);
			resultSet = statement.executeQuery();
			resultSet.next();
			voorstelling = resultSetRijNaarVoorstelling(resultSet);
		return voorstelling;
		}catch(SQLException ex) {
			throw new DAOException("kan genre niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}
	
	public List<Voorstelling> zoekVoorstellingen(Long nummer) {
		Connection connection = null;
		ResultSet resultSet = null;
		PreparedStatement statement = null;
		try {
			List<Voorstelling> voorstellingen = new ArrayList<Voorstelling>();
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(VOORSTELLINGEN_PER_GENRE);
			statement.setLong(1, nummer);
			resultSet = statement.executeQuery();
			while (resultSet.next()) {
				voorstellingen.add(resultSetRijNaarVoorstelling(resultSet));
			}
			return voorstellingen;
		} catch (SQLException ex) {
			throw new DAOException("kan genre niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}

	private Voorstelling resultSetRijNaarVoorstelling(ResultSet resultSet)
			throws SQLException {
		return new Voorstelling(resultSet.getLong("VoorstellingsNr"),
				resultSet.getString("titel"),
				resultSet.getString("Uitvoerders"), resultSet.getDate("Datum"),
				resultSet.getLong("Genrenr"), resultSet.getLong("prijs"),
				resultSet.getLong("VrijePlaatsen"));
	}

	public Voorstelling getVoorstelling(Long nummer) {
		Connection connection = null;
		ResultSet resultSet = null;
		PreparedStatement statement = null;
		try {
			Voorstelling voorstelling = null;
			connection = databaseUtil.getConnection();
			statement = connection.prepareStatement(RESERVEER_VOORSTELLING);
			statement.setLong(1, nummer);
			resultSet = statement.executeQuery();
			resultSet.next();
			voorstelling = resultSetRijNaarVoorstelling(resultSet);
			return voorstelling;
		} catch (SQLException ex) {
			throw new DAOException("kan genre niet lezen uit de database" + ex);
		} finally {
			databaseUtil.close(resultSet, statement, connection);
		}
	}

}
